"""
使用多线程 - 将下载任务派发到多个线程中执行
threading模块 ---> Thread类
"""
import random
import time

from threading import Thread


# 定义函数时，可以在参数列表中使用*作为一个分隔
# *前面的参数叫做位置参数，传参时只需要对号入座即可
# *后面的参数叫做命名关键字参数，传参时要写成"参数名=参数值"的形式
def download(*, filename):
    start = time.time()
    print(f'开始下载{filename}.')
    time.sleep(random.randint(3, 8))
    print(f'{filename}下载完成.')
    end = time.time()
    print(f'下载{filename}花费时间: {end - start:.3f}秒')


def main():
    start = time.time()
    # 创建线程对象，通过target和args属性指定线程要执行的代码以及对应的参数
    # 如果函数的参数是位置参数，可以通过args属性（元组）指定参数值
    # 如果函数的参数是关键字参数，必须使用kwargs属性用字典的方式给出参数名和参数值
    t1 = Thread(target=download, kwargs={'filename': 'Python从入门到住院.pdf'})
    # 通过给线程对象发出start消息启动线程（调用start()方法）
    t1.start()
    t2 = Thread(target=download, kwargs={'filename': 'MySQL从删库到跑路.avi'})
    t2.start()
    t3 = Thread(target=download, kwargs={'filename': 'Linux从精通到放弃.mp3'})
    t3.start()
    # 通过给线程对象发出join消息等待线程执行结束（调用join()方法）
    # 主线程中调用了三个线程的join方法，目的是让主线程等待三个下载线程结束
    t3.join()
    t2.join()
    t1.join()
    end = time.time()
    print(f'总共花费时间: {end - start:.3f}秒')


if __name__ == '__main__':
    main()
